home *** CD-ROM | disk | FTP | other *** search
- {
- > I need help on reading the keyboard in a specific way, I need to read it
- >as a whole not a key at a time. I need to do this For the games I make, Iha
- >to ba able to hold down one key to perform a Function and then hold down
- >another key and scan both keys at the same time but to perform 2 different
- >Functions. For instance, if I hold down the left arrow key to make aCharact
- >run I should be able to hold down the space bar to make him fire agun at th
- >same time.
-
- by Sean Palmer, 1993, released to public domain
- }
-
- Unit keyScan; {for now, ignores extended codes ($E0 prefix)}
-
- Interface
-
- Type
- scanCode = (
- kNone, kEsc, k1, k2, k3, k4, k5, k6, k7, k8, k9, k0, kMinus, kEqual,
- kBack, kTab, kQ, kW, kE, kR, kT, kY, kU, kI, kO, kP, kLBracket,
- kRBracket, kEnter, kCtrl, kA, kS, kD, kF, kG, kH, kJ, kK, kL, kColon,
- kQuote, kTilde, kLShift, kBackSlash, kZ, kX, kC, kV, kB, kN, kM, kComma,
- kPeriod, kSlash, kRShift, kPadStar, kAlt, kSpace, kCaps, kF1, kF2, kF3,
- kF4, kF5, kF6, kF7, kF8, kF9, kF10, kNum, kScroll, kHome, kUp, kPgUp,
- kPadMinus, kLf, kPad5, kRt, kPadPlus, kend, kDn, kPgDn, kIns, kDel,
- kSysReq, kUnknown55, kUnknown56, kF11, kF12);
-
- Const
- kPad7 = kHome;
- kPad8 = kUp;
- kPad9 = kPgUp;
- kPad4 = kLf;
- kPad6 = kRt;
- kPad1 = kend;
- kPad2 = kDn;
- kPad3 = kPgDn;
- letters = [kQ..kP, kA..kL, kZ..kM];
- numbers = [k1..k0, kPad1..kPad3, kPad4..kPad6, kPad7..kPad9];
- FunctionKeys = [kF1..kF10, kF11..kF12];
- keyPad = [kPadStar, kNum..kDel];
-
- Var
- keyboard : set of scanCode;
- lastKeyDown : scanCode;
-
- Implementation
- Uses Dos;
-
- Const
- normChar : Array [scanCode] of Char = (
- {00} #0,^[,'1','2','3','4','5','6','7','8','9','0','-','=',^H,^I,
- {10} 'q','w','e','r','t','y','u','i','o','p','[',']',^M,#0,'a','s',
- {20} 'd','f','g','h','j','k','l',';','''','`',#0,'\','z','x','c','v',
- {30} 'b','n','m',',','.','/',#0,'*',#0,' ',#0,#0,#0,#0,#0,#0,
- {40} #0,#0,#0,#0,#0,#0,#0,'7','8','9','-','4','5','6','+','1',
- {50} '2','3','0','.',#0,#0,#0,#0,#0);
- shiftChar : Array [scanCode] of Char = (
- {00} #0,^[,'!','@','#','$','%','^','&','*','(',')','_','+',^H,^I,
- {10} 'Q','W','E','R','T','Y','U','I','O','P','{','}',^M,#0,'A','S',
- {20} 'D','F','G','H','J','K','L',':','"','~',#0,'|','Z','X','C','V',
- {30} 'B','N','M','<','>','?',#0,'*',#0,' ',#0,#0,#0,#0,#0,#0,
- {40} #0,#0,#0,#0,#0,#0,#0,'7','8','9','-','4','5','6','+','1',
- {50} '2','3','0','.',#0,#0,#0,#0,#0);
-
- Function ascii(k : scanCode) : Char;
- begin
- if [kLShift, kRShift] * keyboard <> [] then
- ascii := shiftChar[k]
- else
- ascii := normChar[k];
- end;
-
- Var
- oldKeyInt : Pointer;
-
- Procedure keyISR; interrupt;
- Var
- k : scanCode;
- b : Byte;
- begin
- Asm
- in al, $60;
- mov b, al;
- and al, $7F;
- mov k, al;
- pushF;
- call [oldKeyInt]; {allow BIOS to process also}
- end;
- memW[$40 : $1A] := memW[$40 : $1C]; {clear BIOS keyboard buffer}
- if shortint(b) >= 0 then
- begin
- keyboard := keyboard + [k];
- lastKeyDown := k;
- end
- else
- if b <> $E0 then
- keyboard := keyboard - [k]
- else ;
- end;
-
- Procedure keybegin;
- begin
- keyboard := [];
- lastKeyDown := kNone;
- getIntVec(9, oldKeyInt);
- setIntVec(9, @KeyISR);
- end;
-
- Var
- ExitSave:Pointer;
-
- Procedure keyend;
- begin
- setIntVec(9, oldKeyInt);
- ExitProc := ExitSave;
- end;
-
-
- begin
- keybegin;
- ExitSave := ExitProc;
- ExitProc := @keyend;
- end.